/*
 * @Author: HeAo
 * @Date: 2022-08-21 21:24:16
 * @LastEditTime: 2022-08-23 10:05:41
 * @LastEditors: HeAo
 * @Description: 
 * @FilePath: \JavaScripe\day-10\05-经典继承.js
 * 别乱动！
 */
// function Animal(name) {
//   this.name = name
//   this.categorys = ['cat', 'rabbit']
// }

// function Dog(name) {
//   this.name = name
// }
// var d1 = new Dog('dog')
// console.log(d1.name);

// 要使 d1继承Animal()构造函数
/*
优点：可以在子类构造函数中向父类构造函数传参。
缺点：
1、与构造函数遇到的问题一样，方法需要占很多内存
2、没有原型链，因此只继承了父类的实例属性、方法，不能继承父类构造函数的原型对象中的属性、方法
3、每个子类的实例都持有父类的实例方法的副本，浪费内存，影响性能，而且无法实现父类的实例方法的复用（不能重写）
解决办法：组合继承
*/

function Animal(name) {
  this.name = name
  this.categorys = ['cat', 'rabbit']
}

function Dog(name, age) {
  // 改变Animai中的this指向 继承Animal的this.name 
  Animal.call(this, name)
  // 子构造函数自有实例属性
  this.age = age
}
var d1 = new Dog('tigger', 12)
console.log(d1);
// 检验1：向d1.categorys添加东西
d1.categorys.push('dog')
console.log(d1.categorys); //[ 'cat', 'rabbit', 'dog' ]

// 检验2：d1添加后对实例d2是否有影响 因为d1、d2引用数据类型实例，两者在堆内存是保存不同的内存地址，所以不会造成影响
var d2 = new Dog()
console.log(d2.categorys); //[ 'cat', 'rabbit' ] 



// 检验对父构造函数的实例是否构成影响
// var a = new Animal('animal')
// console.log(a.name);
// console.log(a.categorys);